package com.quan.hr.service;

import com.quan.hr.commons.vo.HrCalendarVo;
import com.quan.hr.entity.HrCalendar;
import com.quan.commons.utils.PageUtils;
import com.quan.commons.core.MyBaseService;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 项目管理系统-人事管理-工作日历
 *
 * @author yhaoquan
 * @email yhaoquan@163.com
 * @date 2023-02-16 13:19:42
 */
public interface HrCalendarService extends MyBaseService<HrCalendar> {

    /**
     * 列表查询
     * @param vo
     * @return
     */
    public List<HrCalendarVo> queryList(PageUtils pageUtils, HrCalendarVo vo);

    /**
     * 分页查询
     * @param pageUtils
     * @param vo
     * @return
     */
    public PageUtils queryPage(PageUtils pageUtils, HrCalendarVo vo);

    /**
     * 初始化日历，某年
     * @param year
     */
    void initCalendar(Integer year);

    /**
     * 初始化日历，某月
     * @param year
     * @param month
     */
    void initCalendar(Integer year, Integer month);

    /**
     * 初始化日历的节假日
     * @param year
     */
    public Map<String, Map<String, Object>> initCalendarHoliday(Integer year, Integer month);

    /**
     * 查询日历某月
     * @param year
     * @param month
     * @return
     */
    List<HrCalendar> getList(String year, String month);

    /**
     * 获取指定年的每月的工作天数
     * @param year
     * @return
     */
    Map<Integer, Long> getYearCalendarWorkingCount(Integer year) ;

    /**
     * 查询某个范围的日历（包含周末，节假日）
     * @param start
     * @param end
     * @return
     */
    List<HrCalendar> getBetweenCalendar(String start, String end);

    /**
     * 查询某个范围的日历，实际工作天数（不包含周末，节假日）
     * @param start
     * @param end
     * @return
     */
    List<HrCalendar> getBetweenCalendarWorking(String start, String end);

    /**
     * 统计某个范围的日历，实际工作天数（不计算周末和节假日）
     * @param start
     * @param end
     * @return
     */
    public long getBetweenCalendarWorkingCount(String start, String end);

    /**
     * 统计某个范围的日历，实际工作天数（不计算周末和节假日）
     * @param start
     * @param end
     * @return
     */
    public long getBetweenCalendarWorkingCount(LocalDate start, LocalDate end);

    /**
     * 获取某年某月的实际工作天数
     * @param year
     * @param month
     * @return
     */
    public long getWorkingCount(int year, int month);

    /**
     * 设置节假日
     * @param vo
     */
    void setHoliday(HrCalendarVo vo);
}

